package red_neuronal;

public class neurona {

    static double factorA = 0.5;
    double pesos[], valor[], valores[][];
    String[] funciones = {"AND", "OR"};
    boolean cumple = false;

    neurona(int entradas) {
        this.pesos = new double[entradas];
        this.valor = new double[entradas];
        this.valores = new double[entradas][(int) Math.pow(2, (entradas - 1))];
    }

    void valores(double x1, double x2) {
        this.valor[0] = x1;
        this.valor[1] = x2;
    }

    void imprimir() {

        System.out.println("Columnas" + this.valores.length);
        System.out.println("Filas" + this.valores[0].length);
        for (int i = 0; i < valor.length; i++) {
            System.out.println("Valor " + i + valor[i] + " peso" + pesos[i]);
        }
    }

    void rellenar(double x1, double w1, double x2, double w2, double x3, double w3) {
/*
        System.out.println("Columnas" + this.valores.length);
        System.out.println("Filas" + this.valores[0].length + "\n");
        System.out.println(" A " + "\t" + " B " + "\t" + " Z ");
        
         for (int columna1 = 0; columna1 < this.valores[0].length; columna1++) {
         for (int fila = 0; fila < this.valores.length; fila++) {
         System.out.print(this.valores[fila][columna1]+"\t");
         }
         System.out.println("\t");
         }*/
        System.out.println("\n");
        this.valor[0] = x1;
        this.pesos[0] = w1;
        this.valor[1] = x2;
        this.pesos[1] = w2;
        this.valor[2] = x3;
        this.pesos[2] = w3;

    }

    void llenar_valores_or() {

        for (int fila = 0; fila < this.valores[0].length; fila++) {
            if (fila % 2 == 0) {
                valores[0][fila] = -1;
            } else {
                valores[0][fila] = 1;
            }
        }
        valores[1][0] = -1;
        valores[1][1] = -1;
        valores[1][2] = 1;
        valores[1][3] = 1;
        valores[2][0] = -1;
        valores[2][1] = 1;
        valores[2][2] = 1;
        valores[2][3] = 1;
    }

void llenar_valores_xor() {

        for (int fila = 0; fila < this.valores[0].length; fila++) {
            if (fila % 2 == 0) {
                valores[0][fila] = -1;
            } else {
                valores[0][fila] = 1;
            }
        }
        valores[1][0] = -1;
        valores[1][1] = -1;
        valores[1][2] = 1;
        valores[1][3] = 1;
        valores[2][0] = -1;
        valores[2][1] = 1;
        valores[2][2] = 1;
        valores[2][3] = -1;
    }
    void llenar_valores_and() {

        for (int fila = 0; fila < this.valores[0].length; fila++) {
            if (fila % 2 == 0) {
                valores[0][fila] = -1;
            } else {
                valores[0][fila] = 1;
            }
        }
        valores[1][0] = -1;
        valores[1][1] = -1;
        valores[1][2] = 1;
        valores[1][3] = 1;
        valores[2][0] = -1;
        valores[2][1] = -1;
        valores[2][2] = -1;
        valores[2][3] = 1;
    }

    boolean evaluar(double salida) {

        // boolean cumple;
        cumple = false;
        double funcion = 0;
        for (int i = 0; i < this.valor.length; i++) {
            funcion = funcion + (this.valor[i] * this.pesos[i]);
            //System.out.println("valor= " + this.valor[i] + " peso=" + this.pesos[i] + " Función " + funcion + " Salida= " + salida);
        }
        if (salida < 0 && funcion < 0) {
            cumple = true;
        } else {
            // cumple= false;
        }
        if (salida > 0 && funcion > 0) {
            cumple = true;
        } else {
            //  cumple= false;
        }
        return cumple;
    }

    boolean evaluar2() {

        boolean evaluar1;
        int aux = 0;
        do {
            this.valores(valores[0][aux], valores[2][aux]);
            evaluar1 = evaluar(this.valores[2][aux]);
            if (evaluar1 == false) {
                break;
            }
            aux++;
        } while (aux < this.valores.length);
        return evaluar1;
    }

    void recalcular(double valor_deseado) {
        for (int i = 0; i < this.valor.length; i++) {
            this.pesos[i] = this.pesos[i] + (2 * factorA * this.valor[i] * valor_deseado);
            //System.out.println("peso=" + i + " " + this.pesos[i]);
        }


    }
}
